/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.evangelion.core.controller;

import com.evangelion.core.bean.Cliente;
import com.evangelion.core.bean.Declaracion;
import com.evangelion.core.bean.Movimiento;
import com.evangelion.core.bean.MovimientoAux;
import com.evangelion.core.bean.Seccione;
import com.evangelion.core.bean.Usuario;
import com.evangelion.core.daoImpl.MovimientoDaoImpl;
import com.evangelion.core.daoImpl.ConnectionUtil;
import com.evangelion.core.utils.MensajesFace;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import org.primefaces.model.DefaultStreamedContent;

/**
 *
 * @author Kellycasma
 */
@ManagedBean
@ViewScoped
public class MovimientoController extends MensajesFace implements Serializable {

    private Movimiento movimiento;
    private Declaracion declaracion;
    private MovimientoAux movaux;

    private String valorBusqueda;
    private Date fechaI;
    private Date fechaF;
    private Date fechaIn;
    private Date fechaFn;
    private Double valor;
    private int apunte;
    private List<Movimiento> listaMovimiento;
    private List<Movimiento> listaMovimiento2;
    private List<MovimientoAux> listaDeclaracion;
    private List<MovimientoAux> listaMovAuxiliar;
    private Usuario usu;
    private Seccione seccio;
    private DefaultStreamedContent dc;

    @PostConstruct
    public void init() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        HttpSession httpSession = request.getSession(false);
        if (httpSession != null) {
            usu = (Usuario) httpSession.getAttribute("UserSession");
            seccio = (Seccione) httpSession.getAttribute("seccion");
        }
        movimiento = new Movimiento();
        movaux = new MovimientoAux();
        declaracion = new Declaracion();
        declaracion.setCliente(new Cliente());
        declaracion.setSeccion(new Seccione());
        listaMovimiento = new ArrayList<Movimiento>();
        listaMovimiento2 = new ArrayList<Movimiento>();
        listaDeclaracion = new ArrayList<MovimientoAux>();

    }

    public void save() {
        movimiento.setImpIVA(movimiento.getHaber() * movimiento.getIva() / 100);
        movimiento.setTotal(movimiento.getHaber() + movimiento.getImpIVA());
        movimiento.setSeccion(seccio);
        movimiento.setCliente(usu.getCliente());
        movimientoService.save(movimiento);
        limpiarForm();
        msgCambiosGuardados();
        init();
    }

    public void printpdf(Map parameters, String archivo) {
        try {
            Connection conexion = connectionUtil.getConnection();
            String urlMaster = ConnectionUtil.getServletContext().getRealPath(REPORT_FOLDER + archivo);
            JasperReport reporteMaster = null;
            try {
                reporteMaster = (JasperReport) JRLoader.loadObject(urlMaster);
            } catch (Exception e) {
                e.printStackTrace();
            }
            JasperPrint print = null;
            print = JasperFillManager.fillReport(reporteMaster, parameters, conexion);
            byte[] bytes = JasperExportManager.exportReportToPdf(print);
            System.out.println("byte: " + bytes.length);
            if (bytes.length >= 1211 && bytes.length <= 1608) {
                System.out.println("tamano menor");
                dc = null;
                msgValidacion("El reporte no genero ningun resultado");
            } else {
                InputStream stream = new ByteArrayInputStream(bytes);
                dc = new DefaultStreamedContent(stream, "application/pdf", "Archivo.pdf");
                System.out.println("Reporte generado exitosamente.");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void prueba(int i, Date fi, Date ff) {
        System.out.println("apunte    " + i);
        System.out.println("fechai    " + fi);
        System.out.println("fechaf    " + ff);
        String archivo = "reporteMovimiento.jasper";
        Map parameters = new HashMap();
        parameters.put("apunte", i);
        parameters.put("fechaI", fi);
        parameters.put("fechaF", ff);
        printpdf(parameters, archivo);

    }

    public void limpiarForm() {
        movimiento = new Movimiento();
    }

    public void search() {
        listaMovimiento = movimientoService.searchByApunte(seccio, valorBusqueda, fechaI, fechaF);
    }

    public void searchDeclaracion() {
        listaDeclaracion = movimientoService.searchByHecho(seccio, valorBusqueda, fechaIn, fechaFn);
        listaMovAuxiliar = listaDeclaracion;
        System.out.println("Datos declaracion: " + listaDeclaracion.size());
    }

    public void searchFactura() {
        listaMovimiento2 = movimientoService.searchByFactura(seccio, fechaIn, fechaFn);
        MovimientoDaoImpl mdi = new MovimientoDaoImpl();
        Double valtotalhaber = mdi.searchByTotal(seccio, fechaIn, fechaFn);
        Double valtotalimpiva = mdi.searchByImpIva(seccio, fechaIn, fechaFn);

        if (valor != null && valor <= valtotalhaber) {

            Double saldo = valtotalhaber + valtotalimpiva;
            Double desc = saldo - valor;

            Iterator it = listaMovimiento2.iterator();
            declaracion.setCliente(usu.getCliente());
            declaracion.setSeccion(seccio);
            declaracion.setTipo("Declarar_1");
            declaracion.setFechadeclaracion(new Date());
            declaracion.setFecha(new Date());
            declaracion.setNvoValorFactura(desc);
            declaracion.setValorTotalFactura(saldo);
            declaracion.setValorDeclarado(valor);
            declaracion.setValorFactDescontar(desc);

            movimientoService.saveDecl(declaracion);
            while (it.hasNext()) {
                Object objeto = it.next();
                movimiento = (Movimiento) objeto;
                movaux.setFecha(movimiento.getFecha());
                movaux.setConcepto(movimiento.getConcepto());
                movaux.setDocumento(movimiento.getDocumento());
                movaux.setDebe(movimiento.getDebe());
                movaux.setHaber(movimiento.getHaber());
                movaux.setIva(movimiento.getIva());
                movaux.setImpIVA(movimiento.getImpIVA());
                movaux.setBc(movimiento.getBc());
                movaux.setDescuentoDeclaracion(movimiento.getTotal() - desc);
                movaux.setTotal(movimiento.getTotal());
                movaux.setSeccion(seccio);
                movaux.setCliente(usu.getCliente());
                movaux.setDeclaracion(declaracion);
                movimientoService.saveMovA(movaux);

            }

            limpiarForm();
            msgCambiosGuardados();
            init();
        }
    }

    public Movimiento getMovimiento() {
        return movimiento;
    }

    public void setMovimiento(Movimiento movimiento) {
        this.movimiento = movimiento;
    }

    public String getValorBusqueda() {
        return valorBusqueda;
    }

    public void setValorBusqueda(String valorBusqueda) {
        this.valorBusqueda = valorBusqueda;
    }

    public Date getFechaI() {
        return fechaI;
    }

    public void setFechaI(Date fechaI) {
        this.fechaI = fechaI;
    }

    public Date getFechaF() {
        return fechaF;
    }

    public void setFechaF(Date fechaF) {
        this.fechaF = fechaF;
    }

    public List<Movimiento> getListaMovimiento() {
        return listaMovimiento;
    }

    public void setListaMovimiento(List<Movimiento> listaMovimiento) {
        this.listaMovimiento = listaMovimiento;
    }

    public Double getValor() {
        return valor;
    }

    public void setValor(Double valor) {
        this.valor = valor;
    }

    public List<Movimiento> getListaMovimiento2() {
        return listaMovimiento2;
    }

    public void setListaMovimiento2(List<Movimiento> listaMovimiento2) {
        this.listaMovimiento2 = listaMovimiento2;
    }

    public Date getFechaIn() {
        return fechaIn;
    }

    public void setFechaIn(Date fechaIn) {
        this.fechaIn = fechaIn;
    }

    public Date getFechaFn() {
        return fechaFn;
    }

    public void setFechaFn(Date fechaFn) {
        this.fechaFn = fechaFn;
    }

    public DefaultStreamedContent getDc() {
        return dc;
    }

    public void setDc(DefaultStreamedContent dc) {
        this.dc = dc;
    }

    public int getApunte() {
        return apunte;
    }

    public void setApunte(int apunte) {
        this.apunte = apunte;
    }

    public List<MovimientoAux> getListaDeclaracion() {
        return listaDeclaracion;
    }

    public void setListaDeclaracion(List<MovimientoAux> listaDeclaracion) {
        this.listaDeclaracion = listaDeclaracion;
    }

    public List<MovimientoAux> getListaMovAuxiliar() {
        return listaMovAuxiliar;
    }

    public void setListaMovAuxiliar(List<MovimientoAux> listaMovAuxiliar) {
        this.listaMovAuxiliar = listaMovAuxiliar;
    }
}
